"""
文件类型支持模块

定义支持的文件类型和对应的处理策略。
"""

from typing import Dict, List, Set, Tuple
from dataclasses import dataclass
from enum import Enum


class FileType(Enum):
    """支持的文件类型"""
    TEXT = "text"
    PDF = "pdf"
    WORD = "word"
    MARKDOWN = "markdown"
    HTML = "html"
    EXCEL = "excel"
    POWERPOINT = "powerpoint"
    CSV = "csv"
    JSON = "json"


@dataclass
class FileInfo:
    """文件信息"""
    path: str
    name: str
    extension: str
    file_type: FileType
    size: int
    modified_time: float
    is_supported: bool = True


class FileTypeRegistry:
    """文件类型注册表，管理支持的文件类型"""

    def __init__(self):
        """初始化文件类型注册表"""
        self._extension_mapping = self._create_default_mapping()
        self._readers = {}

    def _create_default_mapping(self) -> Dict[str, FileType]:
        """创建默认的文件扩展名映射"""
        return {
            # 文本文件
            '.txt': FileType.TEXT,
            '.text': FileType.TEXT,
            '.log': FileType.TEXT,
            '.md': FileType.MARKDOWN,
            '.markdown': FileType.MARKDOWN,
            '.rst': FileType.TEXT,

            # PDF文件
            '.pdf': FileType.PDF,

            # Microsoft Office
            '.doc': FileType.WORD,
            '.docx': FileType.WORD,
            '.xls': FileType.EXCEL,
            '.xlsx': FileType.EXCEL,
            '.ppt': FileType.POWERPOINT,
            '.pptx': FileType.POWERPOINT,

            # Web文件
            '.html': FileType.HTML,
            '.htm': FileType.HTML,

            # 数据文件
            '.csv': FileType.CSV,
            '.json': FileType.JSON,

            # 其他常见格式
            '.xml': FileType.TEXT,
            '.yaml': FileType.TEXT,
            '.yml': FileType.TEXT,
            '.ini': FileType.TEXT,
            '.conf': FileType.TEXT,
        }

    def get_file_type(self, file_path: str) -> FileType:
        """
        根据文件路径获取文件类型

        Args:
            file_path: 文件路径

        Returns:
            FileType: 文件类型
        """
        import os
        _, ext = os.path.splitext(file_path.lower())
        return self._extension_mapping.get(ext, FileType.TEXT)

    def is_supported(self, file_path: str) -> bool:
        """
        检查文件类型是否支持

        Args:
            file_path: 文件路径

        Returns:
            bool: 是否支持
        """
        return self.get_file_type(file_path) != FileType.TEXT or file_path.lower().endswith(('.txt', '.text', '.md', '.markdown'))

    def get_supported_extensions(self) -> List[str]:
        """
        获取支持的文件扩展名列表

        Returns:
            List[str]: 支持的扩展名列表
        """
        return list(self._extension_mapping.keys())

    def get_file_info(self, file_path: str) -> FileInfo:
        """
        获取文件的详细信息

        Args:
            file_path: 文件路径

        Returns:
            FileInfo: 文件信息对象
        """
        import os

        if not os.path.exists(file_path):
            raise FileNotFoundError(f"文件不存在: {file_path}")

        stat = os.stat(file_path)
        path, filename = os.path.split(file_path)
        name, ext = os.path.splitext(filename)

        file_type = self.get_file_type(file_path)
        is_supported = self.is_supported(file_path)

        return FileInfo(
            path=file_path,
            name=filename,
            extension=ext.lower(),
            file_type=file_type,
            size=stat.st_size,
            modified_time=stat.st_mtime,
            is_supported=is_supported
        )

    def filter_supported_files(self, file_paths: List[str]) -> List[FileInfo]:
        """
        过滤出支持的文件

        Args:
            file_paths: 文件路径列表

        Returns:
            List[FileInfo]: 支持的文件信息列表
        """
        supported_files = []
        for file_path in file_paths:
            try:
                file_info = self.get_file_info(file_path)
                if file_info.is_supported:
                    supported_files.append(file_info)
            except (FileNotFoundError, OSError):
                # 忽略无法访问的文件
                continue

        return supported_files

    def group_by_type(self, file_infos: List[FileInfo]) -> Dict[FileType, List[FileInfo]]:
        """
        按文件类型分组

        Args:
            file_infos: 文件信息列表

        Returns:
            Dict[FileType, List[FileInfo]]: 按类型分组的文件信息
        """
        grouped = {}
        for file_info in file_infos:
            if file_info.file_type not in grouped:
                grouped[file_info.file_type] = []
            grouped[file_info.file_type].append(file_info)
        return grouped


# 全局文件类型注册表实例
file_type_registry = FileTypeRegistry()